/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.excepciones.ProfesionalInexistenteException;
import desarrollosoft.ghce.dao.interfaces.IProfesionalDAO;
import desarrollosoft.ghce.entidades.Profesional;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author ariel
 */
@Repository("profesionalDAO")
public class ProfesionalDAO implements IProfesionalDAO {

    @PersistenceContext
    private EntityManager entityManager;
    
    @Override
    public Profesional buscarPorNombreUsuario(String nombreUsuario) throws ProfesionalInexistenteException {
        /* USAR NAMED QUERYS ???.... */
        Query q = entityManager.createQuery("SELECT p FROM Profesional p WHERE p.nombreUsuario = :nombreUsuario");
        q.setParameter("nombreUsuario", nombreUsuario);
        
        Profesional profesional;
        
        try {
            profesional = (Profesional) q.getSingleResult();
        } catch (NoResultException e) {
            throw new ProfesionalInexistenteException();
        }

        return profesional;
    }

    @Override
    public List<Profesional> buscarTodosProfesionales() {
        Query query = entityManager.createQuery("SELECT p FROM Profesional p "
                + "ORDER BY p.apellido ASC");
        return query.getResultList();
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void crearProfesional(Profesional profesional) throws Exception {
        entityManager.persist(profesional);
    }

    @Override
    @Transactional(propagation = Propagation.MANDATORY)
    public void modificarProfesional(Profesional profesional) throws Exception {
        entityManager.merge(profesional);
    }

    @Override
    public List<Profesional> buscarProfesionales(String dato, String tipoDato) {
        /* tipoDato "Apellido" o "Numero Documento" o "Nombre de Usuario" */
        Query query;
        
        switch (tipoDato) {
            case "Apellido":
                query = entityManager.createQuery("SELECT p FROM Profesional p "
                        + "WHERE p.apellido LIKE CONCAT(:dato,'%') ORDER BY p.apellido ASC");
                query.setParameter("dato", dato);
                break;
            case "Numero Documento":
                query = entityManager.createQuery("SELECT p FROM Profesional p "
                        + "WHERE p.numeroDocumento LIKE CONCAT (:dato,'%') ORDER BY p.numeroDocumento ASC");
                query.setParameter("dato", dato);
                break;
            case "Nombre de Usuario":
                query = entityManager.createQuery("SELECT p FROM Profesional p "
                        + "WHERE p.nombreUsuario LIKE CONCAT (:dato,'%') ORDER BY p.nombreUsuario ASC");
                query.setParameter("dato", dato);
                break;
            default:
                return buscarTodosProfesionales();
        }
        
        return query.getResultList();
    }
    
}
